package servlet;

import controller.ControllerAmministrazioneLocal;
import controller.ControllerAnnunciLocal;
import controller.ControllerMail;
import controller.ControllerUtentiLocal;
import eccezioni.AmministratoreNonBannabileException;
import eccezioni.UtenteGiaBannatoException;
import eccezioni.UtenteGiaModeratoreException;
import eccezioni.UtenteNonAmministratoreException;
import eccezioni.UtenteNonModeratoreException;
import entity.Adesione;
import entity.Annuncio;
import entity.UtenteRegistrato;
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import utilities.AnnuncioConDistanza;
import utilities.Utilities;

/**
 * Servlet per l'amministrazione
 * Permette di svolgere le operazioni di moderazione e amministrazione, sia
 * rispetto agli utenti che agli annunci.
 * @author Ale
 */
public class AmministrazioneServlet extends HttpServlet {

    @EJB
    private ControllerAmministrazioneLocal controllerAmministrazione;
    @EJB
    private ControllerMail controllerMail;
    @EJB
    private ControllerAnnunciLocal controllerAnnunci;
    @EJB
    private ControllerUtentiLocal controllerUtenti;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String action = request.getParameter("action");

        if (action == null) {
            Utilities.errore("Nessuna action specificata alla AmministrazioneServlet", request, response);
        } else if (action.equals("mostraGestionePopup")) {
            mostraGestionePopup(request, response);
        } else if (action.equals("mostraElencoUtenti")) {
            mostraElencoUtenti(request, response);
        } else if (action.equals("mostraElencoAnnunci")) {
            mostraElencoAnnunci(request, response);
        } else if (action.equals("cancellaAnnuncio")) {
            cancellaAnnuncio(request, response);
        } else if (action.equals("bannaUtente")) {
            bannaUtente(request, response);
        } else if (action.equals("promuoviAModeratore")) {
            promuoviAModeratore(request, response);
        } else if (action.equals("declassaDaModeratore")) {
            declassaDaModeratore(request, response);
        }
    }

    private void mostraGestionePopup(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Utilities.forward("/WEB-INF/html/gestione.html", request, response);
    }

    private void mostraElencoUtenti(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("utenti", controllerUtenti.getAllUtenti());
        Utilities.forward("/elencoUtenti.jsp", request, response);
    }

    private void mostraElencoAnnunci(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("annunci", AnnuncioConDistanza.ordina(controllerAnnunci.tuttiGliAnnunci(), Utilities.getUtenteLoggato(request).getIndirizzo().getDescrizione()));
        Utilities.forward("/risultatiRicercaSemplice.jsp", request, response);
    }

    private void cancellaAnnuncio(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        long idAnnuncio = Long.parseLong(request.getParameter("idAnnuncio"));
        Annuncio a = controllerAnnunci.getAnnuncio(idAnnuncio);

        UtenteRegistrato creatore = a.getCreatoreAnnuncio();
        /* notifico gli iscritti */
        for (Adesione ad : a.getAdesioni()) {
            UtenteRegistrato iscritto = ad.getIscritto();
            controllerMail.sendMailAnnuncioCancellatoAIscritto(creatore, iscritto, a);
        }

        controllerMail.sendMailAnnuncioCancellatoACreatore(creatore, a);

        controllerAmministrazione.cancellaAnnuncio(a);

        mostraElencoAnnunci(request, response);
    }

    private void bannaUtente(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        long idUtente = Long.parseLong(request.getParameter("idUtente"));
        UtenteRegistrato u = controllerUtenti.getUtenteById(idUtente);

        try {
            controllerAmministrazione.bannaUtente(u, Utilities.getUtenteLoggato(request));
            controllerMail.sendMailUtenteBannato(u);
            mostraElencoUtenti(request, response);
        } catch (UtenteNonModeratoreException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        } catch (UtenteGiaBannatoException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        } catch (AmministratoreNonBannabileException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        } catch (UtenteNonAmministratoreException ex){
            Utilities.errore(ex.getMessage(), request, response);
        }
    }

    private void promuoviAModeratore(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        long idUtente = Long.parseLong(request.getParameter("idUtente"));
        UtenteRegistrato u = controllerUtenti.getUtenteById(idUtente);

        try {
            controllerAmministrazione.promuoviAModeratore(u, Utilities.getUtenteLoggato(request));
            controllerMail.sendMailUtentePromossoModeratore(u);
            mostraElencoUtenti(request, response);
        } catch (UtenteNonAmministratoreException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        } catch (UtenteGiaModeratoreException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        }
        mostraElencoUtenti(request, response);

    }

    private void declassaDaModeratore(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        long idUtente = Long.parseLong(request.getParameter("idUtente"));
        UtenteRegistrato u = controllerUtenti.getUtenteById(idUtente);
        try {
            controllerAmministrazione.declassaDaModeratore(u, Utilities.getUtenteLoggato(request));
            controllerMail.sendMailUtenteDeclassatoDaModeratore(u);
            mostraElencoUtenti(request, response);
        } catch (UtenteNonAmministratoreException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        } catch (UtenteNonModeratoreException ex) {
            Utilities.errore(ex.getMessage(), request, response);
        }

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    
}
